<?php


/*
 * El loader es el encargado de configurar un container a partir de la configuración de la aplicacion
 * 
 * */

class Exts_Dependency_Configuration_Loader {
	protected $_config;
	protected $_container;
	protected static $_configurationMap;

	/**
	 * El loader es espera un config por parametro. 
	 * Si no se usa carga la configuración con el Zend_Registry.  
	 **/
	
	public function __construct($config = '') {
		if (empty(self::$_configurationMap)) {
			/*
			 * Usa un mapa de [Estrategias => Comandos] para armar la configuracion 
			 * */
			self::$_configurationMap = array ("Singleton" => new Exts_Dependency_Configuration_Command_Singleton(),
											  "Normal" => new Exts_Dependency_Configuration_Command_Normal(),
											  "Inyection" => new Exts_Dependency_Configuration_Command_Inyection(),
											  "Deny" => new Exts_Dependency_Configuration_Command_Deny());
		}
		if ($config == ''){
			$this->_config = Zend_Registry::get('config');
		}else {
			$this->_config = $config;
		}
		/*
		 * Este es el unico punto donde se pide una instancia de Container. Se pide un container no configurado.
		 * */
		$this->_container = Exts_Dependency_Container::UnconfiguredContainerInstance();
		
	}

	/*
	 * Este geter es utilizado por los comandos de configuracion. 
	 **/
	
	public function getContainer () {
		return $this->_container;
	}
	
	
	/*
	 * El load Container basicametne se aprovecha del mapa de comandos, por cada configuración cargada en el archivo 
	 * resuelve la estrategia de carga y la instancia.
	 * */
	public function loadContainer () {
		foreach( $this->_config->dependencies as $class => $configuration ) {
			$this->getStrategy($configuration->InstanceStrategy)->invoke($class, $configuration, $this);
		}
	}

	/**
	 * A la hora de resolver las estrategias a utilizar, se busca la configuración del archivo, si no hay configuración 
	 * asociada se supone carga Normal
	 **/
	
	public function getStrategy($name){
		if (array_key_exists($name, Exts_Dependency_Configuration_Loader::$_configurationMap)){
			return Exts_Dependency_Configuration_Loader::$_configurationMap[$name];
		}
		return Exts_Dependency_Configuration_Loader::$_configurationMap['Normal'];
	}


}